"""
Tavily 新闻查询工具
统一的新闻搜索接口，供所有智能体使用
"""
from tavily import TavilyClient
from datetime import datetime
from utils.retry_helper import retry_on_error
import ssl
import socket
from requests.exceptions import SSLError, ConnectionError, Timeout


# Tavily API Key
TAVILY_API_KEY = "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"


def init_tavily():
    """初始化 Tavily 客户端"""
    if not TAVILY_API_KEY:
        return None
    return TavilyClient(api_key=TAVILY_API_KEY)


@retry_on_error(max_retries=3, delay=2.0, exceptions=(SSLError, ConnectionError, Timeout, socket.timeout, ssl.SSLError))
def search_stock_news(keyword: str, max_results: int = 5) -> str:
    """
    搜索股票相关新闻

    Args:
        keyword: 搜索关键词（股票代码或公司名称）
        max_results: 最大结果数（默认5条）

    Returns:
        新闻信息字符串
    """
    try:
        client = init_tavily()
        if not client:
            return "❌ Tavily API Key 未配置"

        # 构建搜索查询
        query = f"{keyword} 股票 最新消息"

        # 执行搜索
        response = client.search(
            query=query,
            max_results=max_results,
            search_depth="basic",
            include_domains=["sina.com.cn", "eastmoney.com", "10jqka.com.cn", "cnstock.com"]
        )

        if not response or 'results' not in response:
            return f"⚠️ 未找到 {keyword} 的相关新闻"

        results = response['results']

        if not results:
            return f"⚠️ 未找到 {keyword} 的相关新闻"

        # 格式化输出
        news_text = f"【{keyword} 相关新闻】\n\n"

        for i, item in enumerate(results, 1):
            title = item.get('title', '无标题')
            url = item.get('url', '')
            content = item.get('content', '')

            # 截取内容前200字
            if len(content) > 200:
                content = content[:200] + "..."

            news_text += f"{i}. {title}\n"
            news_text += f"   摘要: {content}\n"
            news_text += f"   来源: {url}\n\n"

        return news_text.strip()

    except Exception as e:
        return f"❌ 搜索新闻失败: {str(e)}"


def search_market_news(topic: str = "A股市场", max_results: int = 5) -> str:
    """
    搜索市场整体新闻

    Args:
        topic: 主题（默认"A股市场"）
        max_results: 最大结果数（默认5条）

    Returns:
        新闻信息字符串
    """
    try:
        client = init_tavily()
        if not client:
            return "❌ Tavily API Key 未配置"

        # 构建搜索查询
        query = f"{topic} 今日 最新动态"

        # 执行搜索
        response = client.search(
            query=query,
            max_results=max_results,
            search_depth="basic"
        )

        if not response or 'results' not in response:
            return f"⚠️ 未找到 {topic} 的相关新闻"

        results = response['results']

        if not results:
            return f"⚠️ 未找到 {topic} 的相关新闻"

        # 格式化输出
        news_text = f"【{topic} 市场动态】\n\n"

        for i, item in enumerate(results, 1):
            title = item.get('title', '无标题')
            content = item.get('content', '')

            # 截取内容前150字
            if len(content) > 150:
                content = content[:150] + "..."

            news_text += f"{i}. {title}\n"
            news_text += f"   {content}\n\n"

        return news_text.strip()

    except Exception as e:
        return f"❌ 搜索市场新闻失败: {str(e)}"


def search_industry_news(industry: str, max_results: int = 3) -> str:
    """
    搜索行业新闻

    Args:
        industry: 行业名称（如"银行"、"科技"）
        max_results: 最大结果数（默认3条）

    Returns:
        新闻信息字符串
    """
    try:
        client = init_tavily()
        if not client:
            return "❌ Tavily API Key 未配置"

        # 构建搜索查询
        query = f"{industry}行业 最新动态 趋势"

        # 执行搜索
        response = client.search(
            query=query,
            max_results=max_results,
            search_depth="basic"
        )

        if not response or 'results' not in response:
            return f"⚠️ 未找到 {industry} 行业的相关新闻"

        results = response['results']

        if not results:
            return f"⚠️ 未找到 {industry} 行业的相关新闻"

        # 格式化输出
        news_text = f"【{industry}行业动态】\n\n"

        for i, item in enumerate(results, 1):
            title = item.get('title', '无标题')
            content = item.get('content', '')

            # 截取内容前150字
            if len(content) > 150:
                content = content[:150] + "..."

            news_text += f"{i}. {title}\n"
            news_text += f"   {content}\n\n"

        return news_text.strip()

    except Exception as e:
        return f"❌ 搜索行业新闻失败: {str(e)}"
